*/
#include <linux/types.h>
#include <linux/cache.h>
+#include <linux/module.h>
#include <asm/hypervisor.h>
#include <xen/features.h>
-/* When we rebase to a more recent Linux we can use __read_mostly here. */
-unsigned long xen_features[XENFEAT_NR_SUBMAPS] __cacheline_aligned;
+u8 xen_features[XENFEAT_NR_SUBMAPS * 32] __read_mostly;
+EXPORT_SYMBOL(xen_features);
void setup_xen_features(void)
{
- uint32_t *flags = (uint32_t *)&xen_features[0];
xen_feature_info_t fi;
- int i;
+ int i, j;
for (i=0; i<XENFEAT_NR_SUBMAPS; i++) {
fi.submap_idx = i;
if (HYPERVISOR_xen_version(XENVER_get_features, &fi) < 0)
break;
- flags[i] = fi.submap;
+ for (j=0; j<32; j++)
+ xen_features[i*32+j] = !!(fi.submap & 1<<j);
}
}
extern void setup_xen_features(void);
-extern unsigned long xen_features[XENFEAT_NR_SUBMAPS];
+extern u8 xen_features[XENFEAT_NR_SUBMAPS * 32];
-#define xen_feature(flag) (test_bit(flag, xen_features))
+#define xen_feature(flag) (xen_features[flag])
#endif /* __ASM_XEN_FEATURES_H__ */